package designpatterns.proxy.cglibproxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.logging.Logger;

/**
 * @Description：
 * @Author：LiDong
 * @Create：2021/3/29
 * @Version：1.0.0
 */
public class CglibUserServiceProxy implements MethodInterceptor {

    private static final Logger log = Logger.getLogger(String.valueOf(CglibUserServiceProxy.class));

    /**
     * 维护一个目标对象
     */
    private final Object target;

    public CglibUserServiceProxy(Object target) {
        this.target = target;
    }

    /**
     * 为目标对象生成代理对象
     */
    public Object getProxyInstance() {
        //工具类
        Enhancer en = new Enhancer();
        //设置父类
        en.setSuperclass(target.getClass());
        //设置回调函数
        en.setCallback(this);
        //创建子类对象代理
        return en.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        log.info("方法前...");
        // 执行目标对象的方法
        method.invoke(target, args);
        log.info("方法后....");
        return null;
    }
}
